サーバー上でのサードパーティライブラリを使用 On the server, with third-party libraries
Data Fetching: Fetching, Caching, and Revalidating | Next.js
サーバー上でサードパーティのライブラリを使ってデータ取得する場合、
fetch wrapper Next.jsをサポートしていないか公開していないライブラリ(例えば、データベース、CMS、ORMクライアントなど)のリクエストのCashing キャッシュやrevalidation 再検証の振る舞いを、Route Segment Next.js設定オプションやReactのcache Reactを使って設定できる
データがキャッシュされるかどうかは、Route Segment Next.jsがStatic Rendering 静的レンダリングかDynamic Rendering 動的レンダリングされるかによる。
Static Rendering 静的レンダリング(デフォルト)
リクエストの出力はCashing キャッシュされ、ルートセグメントの一部として再検証される
Dynamic Rendering 動的レンダリングの場合
リクエストの出力はキャッシュされず、セグメントがレンダリングされるたびにリクエストが再フェッチされる。
また、実験的なunstable_cache APIを利用することもできる。
参考: Rendering: Server Components | Next.js
例: cache React
code:app/utils.ts
import { cache } from 'react'
// Reactのキャッシュ機能がデータリクエストをメモ化するために使われている
export const getItem = cache(async (id: string) => {
const item = await db.item.findUnique({ id })
return item
})
code: app/item/id/layout.tsx
import { getItem } from '@/utils/get-item'
// レイアウトで再検証オプションが3600に設定
export const revalidate = 3600 // 最大毎時データを再検証
export default async function Layout({ params: { id } }: { params: { id: string } }) {
const item = await getItem(id)
// ...
}
code: app/item/id/page.tsx
import { getItem } from '@/utils/get-item'
// ページでも再検証オプションが3600に設定
export const revalidate = 3600 // 最大毎時データを再検証
export default async function Page({ params: { id } }: { params: { id: string } }) {
const item = await getItem(id)
// ...
}
getItem関数が2回呼ばれても、データベースへのクエリは一度だけ行われる。これで、データ取得の効率がぐんと上がる。
? どういうこと?
Layoutとpageって、実質的に同じページだから、別に一回呼ぶでいいんじゃないの?2回呼ぶ必要あるの?
componentの都合上、それぞれで呼ばないといけないけど、cache Reactで包んでいるから、1回しか呼ばれないという理解であってる?
前までは、2回も呼ぶことはおかしくて、親の方で1度fetchして、Global State frontendに保存して、各所でimportしていたんだけど、その設計が不要になったということ?
Route Segment Next.js設定オプションで設定する例はどんなん?
fetchCache: 'auto' | 'default-cache' | 'only-cache' | 'force-cache' | 'force-no-store' | 'default-no-store' | 'only-no-store'